package com.lipuwater.agent.ble.command;


import com.lipuwater.agent.ble.utils.CRC16M;

/**
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　　┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　┃
 * 　　┃　　　　　　　┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛
 * 　　　　┃　　　┃神兽保佑
 * 　　　　┃　　　┃永无BUG！
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━神兽出没━━━━━━
 * Created by  Administrator  on 2016/11/28.
 * Email:924686754@qq.com
 * 获取设备暂停天数
 * 0x35指令，数字签名+des
 */
public class DeviceCommand35 {
    /*包头1
      包头2
      数据长度
      消息序号SN
      功能码
      起始地址低字节
      起始地址高字节
      读取数量   PS:读取数量相当于总地址数量address
      CRC低字节
      CRC高字节*/

    /**
     * 30指令
     * address 地址，从开始到结束(参照地址状态表)
     * msgNumber 消息序列号，随机产生的消息序列号，PS：在并发发送或者获取指令的时候最好不要产生重复的消息序列号，消息序列号是为了设备应答后app能知道是哪条请求
     * 07=数据长度，从消息序号SN开始到整个数据包结束所占用的字节数
     * 30=功能码
     * 因为此类负责0x30指令，所以07和30先写死
     * PS:16进制
     *
     * @return
     */
    public static String getCommand(String[] address, String msgNumber) {
        String results = "07" + msgNumber + "35";
        //起始位置低字节，注意拿的是后面两个
        String startAddress = Integer.toHexString(Integer.valueOf(address[0]));
        String lowByte = startAddress.substring(startAddress.length() - 2, startAddress.length());
        //起始位置高字节，注意拿的是前面两个
        String highByte = startAddress.substring(0, 2);
        results = results + lowByte + highByte;
        //读取长度
        String readLength = Integer.toHexString(address.length & 0xFF);
        readLength = readLength.length() == 1 ? '0' + readLength : readLength;
        results = results + readLength;
        //CRC校验位,去掉包头
        byte[] sbuf = CRC16M.getSendBuf(results);
        results = CRC16M.getBufHexStr(sbuf);
        //检验数据段是否包含ff
        results = vFill(results);
        return "FFFF" + results;//添加包头并返回添加了CRC校验字节的完整指令
    }


    /**
     * 检查指令数据段是否包含FF，是的话在ff后面填充0x55
     *
     * @param command
     */
    private static String vFill(String command) {
        String results = "";
        for (int i = 0; i < command.length() - 4; i += 2) {
            if (command.substring(i, i + 2).equals("ff") || command.substring(i, i + 2).equals("FF")) {
                results += command.substring(i, i + 2) + "55";
            } else {
                results += command.substring(i, i + 2);
            }
        }
        return results + command.substring(command.length() - 4, command.length());
    }


}
